package student.aistar.day02;

/**
 * 用来演示: 变量的定义和使用
 */
public class VarInitDemo {
    public static void main(String[] args) {
        byte b = 127;
        short s = 100;

        //存储一个二进制, 只要0b开头


        //java中只是用单引号表示一个字符
        //'a' -> char类型 -> int类型
        //'a' ---> 97
        //'A' ---> 65
        //'0' ---> 48

        //java中以0开头的代表的是八进制
        //八进制转换十进制032 = 3*8^1 + 2*8^0 = 26

        //int类型 -> long类型

        //推荐定义long的方式采用隐式转换


        //jdk7.x提供的 '_' 为了增强数字的可读性而已


        //Date date = new Date(3L*24*60*60*100*1000*1000);//前面加个L的好处与后面加L的好处: 后面乘的时候可能会超过int范围, 前面一加就不需要担心超过,后面再加需要担心

        //浮点数 - 并不是用来进行精确计算的
        //后面java.math.Decimal类来解决小鼠计算的时候精度丢失的问题
        double d =1.75;

        //推荐定义double
        double d2 = 5.76D;

        //float的精度是7或者8
        //double的精度是16
        //double类型强转float类型
//        float f = 3.14; 这里报错的原因是: 3.14默认为double 大的放到小的精度偏失, 并且3.14的精度(小数点后面化成二进制) 超过了float的精度
        float f = (float) 3.14;

        //隐式转换
        float f2 = 3.14F;
        System.out.println(f2);

        //补充
        //数字进行计算的时候, 都会转换成二进制进行计算
        //小数进行计算的时候, 还是不可逆的
        System.out.println(2.0 - 1.1);//0.8999999999999999  原因: 计算转换成二进制时, 一直除不尽2
        System.out.println(2.0F - 1.1F);//0.9   原因: 精度小, 除到后面直接省略

        //int -> float  x
        //int -> double  √

        int n = 123456789;
        float ft = n;
        System.out.println(ft);//1.23456792E8 与n偏离的原因: 因为n的大小超过float所能承受的大小所以超过的部分会丢失

        double ft2 = n;
        System.out.println(ft2);// 1.23456789E8 原因: double 没有超

    }
}
